package com.myworld.springTask;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;

/**
 * SpringTask 学习：
 *  cron表达式:
      cron表达式包括6部分：
         秒（0~59）
         分钟（0~59）
         小时（0~23）
         月中的天（1~31）
         月（1~12）
         周中的天
         （填写MON，TUE，WED，THU，FRI，SAT,SUN，或数字1~7 1表示MON，依次类推）
        特殊字符介绍：
             “/”字符表示指定数值的增量
             “*”字符表示所有可能的值
             “-”字符表示区间范围
             "," 字符表示列举
             “？”字符仅被用于月中的天和周中的天两个子表达式，表示不指定值
         例子：
             0/3 * * * * * 每隔3秒执行
             0 0/5 * * * * 每隔5分钟执行
             0 0 0 * * * 表示每天0点执行
             0 0 12 ? * WEN 每周三12点执行
             0 15 10 ? * MON-FRI 每月的周一到周五10点 15分执行
             0 15 10 ? * MON,FRI 每月的周一和周五10点 15分执行
 */
//@Component
public class TestTask {
   private static final Logger logger= LoggerFactory.getLogger(TestTask.class);

   //@Scheduled(fixedRate = 8000) //上次执行开始时间后8秒执行, 如果上次任务执行时间超过设定的时间时,则在上次任务后立即执行
   //@Scheduled(fixedDelay = 3000) //上次任务执行完毕后3秒后执行下一次任务
   //@Scheduled(initialDelay = 3000,fixedRate =5000) //第一次延迟3秒执行，以后每个5秒执行一次
    @Scheduled(cron="0/3 * * * * *") //每隔3秒执行一次，如果上次任务执行时间超过设定的时间时,则在上次任务后执行
    public void task1(){
        logger.info("===========测试定时任务开始==============");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("===========测试定时任务结束==============");
    }

    /**
     * SpringTask 默认在同一个bean中任务串行执行(只有一个线程,要想并行执行需要设置并行线程池)
     */
    @Scheduled(fixedDelay = 3000) //上次任务执行完毕后3秒后执行下一次任务
    public void task2(){
        logger.info("===========测试定时任务2开始==============");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("===========测试定时任务2结束==============");
    }
}
